package juego.motor;
import juego.interfaces.Posicionable;
import juego.tipos.*;

public class MotorRastreador extends Motor{
	private Posicionable objetivoARastrear;
	private double anguloDeGiroEnRadianes;
	private int distanciaDeVision;
	
	//Responde si el objetivo del rastreador esta al alcance de vision.
	private boolean veObjetivo(Posicion posicionActual){
		//El campo esta definido por una distancia maxima de vision, 
		//y un angulo de giro respecto de la orientacion actual.
	
		if(posicionActual.dist(objetivoARastrear.getPosicion()) > distanciaDeVision) return false;//Esta muy lejos
		
		double anguloIz = this.velocidadDeMovimiento.theta()+anguloDeGiroEnRadianes;
		double anguloDer = this.velocidadDeMovimiento.theta()-anguloDeGiroEnRadianes;
		
		Vector dir = posicionActual.dirigidoA(objetivoARastrear.getPosicion());
		
		if( (anguloIz >= dir.theta())&&(anguloDer <= dir.theta()) ){return true;}//esta en la porcion definida
		
		return false;
	}

	public Posicion mover(Posicion posicionActual){	
		//Corrige la trayectoria actual si el objetivo esta dentro del campo de vision.
		//sino se mueve en linea recta, siguendo la trayectoria previa.
		if(this.veObjetivo(posicionActual)){
			Vector direccion = posicionActual.dirigidoA(objetivoARastrear.getPosicion());
			velocidadDeMovimiento = new Velocidad(direccion,velocidadDeMovimiento.getModulo());
		}

		return aplicarVelocidad(posicionActual);
	}
	
	public void setDistanciaDeVision(int nuevDistancia){
		this.distanciaDeVision = nuevDistancia;
	}

	public void setAnguloDeGiro(double nuevoAnguloDEGiroEnRadianes){
		this.anguloDeGiroEnRadianes = nuevoAnguloDEGiroEnRadianes;
	}
	
	public MotorRastreador(Velocidad velocidadInicial, Posicionable objetivo){
		this.setVelocidad(velocidadInicial);
		objetivoARastrear =objetivo;
	}
		
}
